# Copyright (c) Facebook, Inc. and its affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
import torch

# pointwise operators can go through a faster pathway

tensor_magic_methods = ["add", ""]
pointwise_magic_methods_with_reverse = (
    "add",
    "sub",
    "mul",
    "floordiv",
    "div",
    "truediv",
    "mod",
    "pow",
    "lshift",
    "rshift",
    "and",
    "or",
    "xor",
)
pointwise_magic_methods = (
    *(x for m in pointwise_magic_methods_with_reverse for x in (m, "r" + m)),
    "eq",
    "gt",
    "le",
    "lt",
    "ge",
    "gt",
    "ne",
    "neg",
    "pos",
    "abs",
    "invert",
    "iadd",
    "isub",
    "imul",
    "ifloordiv",
    "idiv",
    "itruediv",
    "imod",
    "ipow",
    "ilshift",
    "irshift",
    "iand",
    "ior",
    "ixor",
    "int",
    "long",
    "float",
    "complex",
)

pointwise_methods = (*(f"__{m}__" for m in pointwise_magic_methods),)

pointwise = (
    *(getattr(torch.Tensor, m) for m in pointwise_methods),
    torch.nn.functional.dropout,
    torch.where,
    torch.Tensor.abs,
    torch.abs,
    torch.Tensor.acos,
    torch.acos,
    torch.Tensor.acosh,
    torch.acosh,
    torch.Tensor.add,
    torch.add,
    torch.Tensor.addcdiv,
    torch.addcdiv,
    torch.Tensor.addcmul,
    torch.addcmul,
    torch.Tensor.addr,
    torch.addr,
    torch.Tensor.angle,
    torch.angle,
    torch.Tensor.asin,
    torch.asin,
    torch.Tensor.asinh,
    torch.asinh,
    torch.Tensor.atan,
    torch.atan,
    torch.Tensor.atan2,
    torch.atan2,
    torch.Tensor.atanh,
    torch.atanh,
    torch.Tensor.bitwise_and,
    torch.bitwise_and,
    torch.Tensor.bitwise_left_shift,
    torch.bitwise_left_shift,
    torch.Tensor.bitwise_not,
    torch.bitwise_not,
    torch.Tensor.bitwise_or,
    torch.bitwise_or,
    torch.Tensor.bitwise_right_shift,
    torch.bitwise_right_shift,
    torch.Tensor.bitwise_xor,
    torch.bitwise_xor,
    torch.Tensor.ceil,
    torch.ceil,
    torch.celu,
    torch.nn.functional.celu,
    torch.Tensor.clamp,
    torch.clamp,
    torch.Tensor.clamp_max,
    torch.clamp_max,
    torch.Tensor.clamp_min,
    torch.clamp_min,
    torch.Tensor.copysign,
    torch.copysign,
    torch.Tensor.cos,
    torch.cos,
    torch.Tensor.cosh,
    torch.cosh,
    torch.Tensor.deg2rad,
    torch.deg2rad,
    torch.Tensor.digamma,
    torch.digamma,
    torch.Tensor.div,
    torch.div,
    torch.dropout,
    torch.nn.functional.dropout,
    torch.nn.functional.elu,
    torch.Tensor.eq,
    torch.eq,
    torch.Tensor.erf,
    torch.erf,
    torch.Tensor.erfc,
    torch.erfc,
    torch.Tensor.erfinv,
    torch.erfinv,
    torch.Tensor.exp,
    torch.exp,
    torch.Tensor.exp2,
    torch.exp2,
    torch.Tensor.expm1,
    torch.expm1,
    torch.feature_dropout,
    torch.Tensor.float_power,
    torch.float_power,
    torch.Tensor.floor,
    torch.floor,
    torch.Tensor.floor_divide,
    torch.floor_divide,
    torch.Tensor.fmod,
    torch.fmod,
    torch.Tensor.frac,
    torch.frac,
    torch.Tensor.frexp,
    torch.frexp,
    torch.Tensor.gcd,
    torch.gcd,
    torch.Tensor.ge,
    torch.ge,
    torch.nn.functional.gelu,
    torch.nn.functional.glu,
    torch.Tensor.gt,
    torch.gt,
    torch.Tensor.hardshrink,
    torch.hardshrink,
    torch.nn.functional.hardshrink,
    torch.nn.functional.hardsigmoid,
    torch.nn.functional.hardswish,
    torch.nn.functional.hardtanh,
    torch.Tensor.heaviside,
    torch.heaviside,
    torch.Tensor.hypot,
    torch.hypot,
    torch.Tensor.i0,
    torch.i0,
    torch.Tensor.igamma,
    torch.igamma,
    torch.Tensor.igammac,
    torch.igammac,
    torch.Tensor.isclose,
    torch.isclose,
    torch.Tensor.isfinite,
    torch.isfinite,
    torch.Tensor.isinf,
    torch.isinf,
    torch.Tensor.isnan,
    torch.isnan,
    torch.Tensor.isneginf,
    torch.isneginf,
    torch.Tensor.isposinf,
    torch.isposinf,
    torch.Tensor.isreal,
    torch.isreal,
    torch.Tensor.kron,
    torch.kron,
    torch.Tensor.lcm,
    torch.lcm,
    torch.Tensor.ldexp,
    torch.ldexp,
    torch.Tensor.le,
    torch.le,
    torch.nn.functional.leaky_relu,
    torch.Tensor.lerp,
    torch.lerp,
    torch.Tensor.lgamma,
    torch.lgamma,
    torch.Tensor.log,
    torch.log,
    torch.Tensor.log10,
    torch.log10,
    torch.Tensor.log1p,
    torch.log1p,
    torch.Tensor.log2,
    torch.log2,
    torch.nn.functional.logsigmoid,
    torch.Tensor.logical_and,
    torch.logical_and,
    torch.Tensor.logical_not,
    torch.logical_not,
    torch.Tensor.logical_or,
    torch.logical_or,
    torch.Tensor.logical_xor,
    torch.logical_xor,
    torch.Tensor.logit,
    torch.logit,
    torch.Tensor.lt,
    torch.lt,
    torch.Tensor.maximum,
    torch.maximum,
    torch.Tensor.minimum,
    torch.minimum,
    torch.nn.functional.mish,
    torch.Tensor.mvlgamma,
    torch.mvlgamma,
    torch.Tensor.nan_to_num,
    torch.nan_to_num,
    torch.Tensor.ne,
    torch.ne,
    torch.Tensor.neg,
    torch.neg,
    torch.Tensor.nextafter,
    torch.nextafter,
    torch.Tensor.outer,
    torch.outer,
    torch.polar,
    torch.Tensor.polygamma,
    torch.polygamma,
    torch.Tensor.positive,
    torch.positive,
    torch.Tensor.pow,
    torch.pow,
    torch.Tensor.prelu,
    torch.prelu,
    torch.nn.functional.prelu,
    torch.Tensor.rad2deg,
    torch.rad2deg,
    torch.Tensor.reciprocal,
    torch.reciprocal,
    torch.Tensor.relu,
    torch.relu,
    torch.nn.functional.relu,
    torch.nn.functional.relu6,
    torch.Tensor.remainder,
    torch.remainder,
    torch.Tensor.round,
    torch.round,
    torch.rrelu,
    torch.nn.functional.rrelu,
    torch.Tensor.rsqrt,
    torch.rsqrt,
    torch.rsub,
    torch.selu,
    torch.nn.functional.selu,
    torch.Tensor.sgn,
    torch.sgn,
    torch.Tensor.sigmoid,
    torch.sigmoid,
    torch.nn.functional.sigmoid,
    torch.Tensor.sign,
    torch.sign,
    torch.Tensor.signbit,
    torch.signbit,
    torch.nn.functional.silu,
    torch.Tensor.sin,
    torch.sin,
    torch.Tensor.sinc,
    torch.sinc,
    torch.Tensor.sinh,
    torch.sinh,
    torch.nn.functional.softplus,
    torch.nn.functional.softshrink,
    torch.Tensor.sqrt,
    torch.sqrt,
    torch.Tensor.square,
    torch.square,
    torch.Tensor.sub,
    torch.sub,
    torch.Tensor.tan,
    torch.tan,
    torch.Tensor.tanh,
    torch.tanh,
    torch.nn.functional.tanh,
    torch.threshold,
    torch.nn.functional.threshold,
    torch.trapz,
    torch.Tensor.true_divide,
    torch.true_divide,
    torch.Tensor.trunc,
    torch.trunc,
    torch.Tensor.xlogy,
    torch.xlogy,
    torch.rand_like,
)
